iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0

案例1 - 函式包含哪些變數

var globalVariable ='全域變數';
var obj = {
    aFunction: function(para) {
        var localVariables ='區域變數';
        console. log(para, localVariables, arguments, this, globalVariable) 
    }
}
//包含傳入的參數
obj.aFunction('一段描述',2,3);  //執行物件內的函式,並帶入參數

執行結果
https://ithelp.ithome.com.tw/upload/images/20200921/20121004C952iPuo0S.jpg

  • aFunction: function(para) 中的(para),只帶入一個參數,所以只接收到
    obj.aFunction('一段描述',2,3);中第一個參數 '一段描述'
  • 區域內的變數 localVariables,只在 function 作用。
  • arguments是會把傳入的參數全部接收,是一個類陣列(陣列相關指令無法用ex.foreach)
  • 執行物件内函式的 this 會與一般函式有所不同。
  • globalVariable 是全域變數,非函式本身內的,會一層一層往外面尋找,直到有這變數為止。

案例2 - 將傳進來已存在的參數重新定義

function callName(a) { // a 已經定義好,就是 callName('小明') 傳入參數中的'小明'
    console. log(a);
    var a;  // 宣告變數如果本身已經存在,此宣告是沒有任何作用
    console. log(a);
    a = '花道';
}

callName('小明')  //把參數帶入執行
// 輸出結果 小明 小明
function callName(a) {   
    console. log(a);
    var a;  
    console. log(a);
    a = '花道';  // 重新定義傳進來參數的變數,並重新賦值 '花道'
    console. log(a);
}

callName('小明')  
// 輸出結果 小明 小明 花道

案例3 - 自定義參數與傳送的值與順序

function callMore(d, c, b, a) { // 參數是看順序進來的,參數的名稱內的只是接收過來的參數
    console. log(d, c, b, a);
}
var a = 'a';
var b = 'b';
var c = 'c';
callMore(a, b, c);
// 輸出結果 a b c undefined
  • function callMore(d, c, b, a)
    函式內參數的名稱可以自定義,跟傳入的參數名稱是沒有關係,只注重接收了幾個值跟順序如何。
  • callMore(a, b, c);
    傳進來的參數只有三個,跟函式內有4個自訂義參數,所以最後一個會是 undefined 找不到。

案例4 - 傳參考特性

function callObject(obj) {
    obj.name = '花道家';
}
var family = {
    name:'小明家'
}
callObject(family);
console.log(family);
// 輸出結果 花道家
  • callObject(family); 傳入參數是物件的話,會有傳參考特性。
  • family 函式物件傳入 function callObject(obj) 中的 obj。
  • callObject(obj) 函式內重新把 family 物件中的 name:'小明家' 重新賦值為 obj.name = '花道家'。
  • 因為這樣的特性,大部分程式碼規範會建議不要調整屬性內的參數,以免出錯。

案例5 - callback function

function functionB(fn){
    fn('小明');
}
functionB(function(a){
    console.log(a);
})
// 輸出結果 小明
  • 最底層 function(a){console.log(a);} 物件帶入 functionB 。
  • functionB 帶入 function functionB(fn),傳入 fn 參數。
  • fn 帶入 '小明' 參數,就往回走到 functionB 。
  • functionB 將'小明' 參數再往回 function(a),將'小明'帶入 a,並 console.log(a);
  • '小明'參數 > functionB > function(a)
function callSomeone(name, a) {
    console.log(name +'你好', a)
}
function functionB(fn) {
    fn('小明', 666);
}
functionB(callSomeone)
// 輸出結果 小明你好 666
  • '小明', 666 參數帶入 > functionB 帶入> callSomeone內執行 console.log。

案例6 - arguments 變數

function callArg(a) {
    console.log(a, arguments);
}
callArg(1, 2, 3, '4');

執行結果
https://ithelp.ithome.com.tw/upload/images/20200921/2012100433KIrwaaxu.jpg

  • function callArg(a) 接收參數只有一個,為 callArg(1, 2, 3, '4'); 第一順序的 1。
  • callArg(a) 執行裡有 arguments 變數
  • arguments 是會把傳入的參數全部接收,是一個類陣列
  • arguments 可以用基本 for 迴圈跑,但是陣列相關指令無法用會報錯 ex.foreach

上一篇
05. 函式
下一篇
7. 最常見的 this - 物件的方法調用
系列文
JS 作品實戰應用 - Vue 電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言